// WorldUnitsManager.js

class WorldUnitsManager {
    constructor() {
        // 基础单位配置
        this.UNIT_SCALE = 100; // 1 meter = 100 THREE.js units

        // 世界参数配置
        this.WORLD = {
            // 实际物理尺寸（米）
            SIZE_METERS: {
                WIDTH: 15,   // 15米宽
                HEIGHT: 15   // 15米高
            },
            // 网格参数
            GRID: {
                CELL_SIZE_METERS: 0.05,    // 网格单元实际大小（5厘米）
                MAJOR_INTERVAL: 1.0,       // 主网格间隔（1米）
                MAJOR_LINE_OPACITY: 0.35,  // 主网格线不透明度
                MINOR_LINE_OPACITY: 0.3,   // 次网格线不透明度
            },
            // 参考尺寸
            REFERENCE: {
                ROBOT_DIAMETER: 0.35,      // 机器人直径（米）
                GRID_CELLS_PER_ROBOT: 7    // 机器人直径应该覆盖的网格数
            },
            // 坐标轴参数
            AXIS: {
                LENGTH_METERS: 0.3,        // 坐标轴长度（米）
                HEIGHT_OFFSET: 0.001       // 高度偏移，避免与网格重叠
            }
        };

        // 颜色定义
        this.COLORS = {
            GRID: {
                MAJOR: 0x888888,  // 主网格线颜色（每米）
                MINOR: 0x98CC74   // 次网格线颜色（每5厘米）
            }
        };
    }

    // 单位转换方法
    metersToUnits(meters) {
        return meters * this.UNIT_SCALE;
    }

    unitsToMeters(units) {
        return units / this.UNIT_SCALE;
    }

    // 获取世界尺寸（THREE.js单位）
    getWorldSize() {
        return {
            width: this.metersToUnits(this.WORLD.SIZE_METERS.WIDTH),
            height: this.metersToUnits(this.WORLD.SIZE_METERS.HEIGHT)
        };
    }

    // 获取网格参数（THREE.js单位）
    getGridParameters() {
        return {
            cellSize: this.metersToUnits(this.WORLD.GRID.CELL_SIZE_METERS),
            majorInterval: this.metersToUnits(this.WORLD.GRID.MAJOR_INTERVAL),
            majorLineOpacity: this.WORLD.GRID.MAJOR_LINE_OPACITY,
            minorLineOpacity: this.WORLD.GRID.MINOR_LINE_OPACITY
        };
    }

    // 获取坐标轴参数（THREE.js单位）
    getAxisParameters() {
        return {
            length: this.metersToUnits(this.WORLD.AXIS.LENGTH_METERS),
            heightOffset: this.metersToUnits(this.WORLD.AXIS.HEIGHT_OFFSET)
        };
    }

    // 验证网格设置
    validateGridSettings() {
        const cellsPerRobot = this.WORLD.REFERENCE.ROBOT_DIAMETER / this.WORLD.GRID.CELL_SIZE_METERS;
        const expectedCells = this.WORLD.REFERENCE.GRID_CELLS_PER_ROBOT;
        const tolerance = 0.1;

        const isValid = Math.abs(cellsPerRobot - expectedCells) <= tolerance;

        if (!isValid) {
            console.warn(`Grid validation failed: Robot diameter covers ${cellsPerRobot.toFixed(2)} cells, expected ${expectedCells}`);
        }

        return isValid;
    }

    // 获取颜色配置
    getColors() {
        return this.COLORS;
    }

    // 获取完整配置
    getConfig() {
        return {
            UNIT_SCALE: this.UNIT_SCALE,
            WORLD: this.WORLD,
            COLORS: this.COLORS
        };
    }
}

// 创建单例实例
const worldUnitsManager = new WorldUnitsManager();

// 导出到全局作用域
if (typeof window !== 'undefined') {
    window.worldUnitsManager = worldUnitsManager;
    window.WorldUnitsManager = WorldUnitsManager;
}

// CommonJS 模块导出
if (typeof module !== 'undefined' && module.exports) {
    module.exports = {
        WorldUnitsManager,
        worldUnitsManager
    };
}